package com.feiyisys.service.impl;

import cn.hutool.crypto.digest.BCrypt;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.feiyisys.dto.UserLoginDTO;
import com.feiyisys.entity.Admin;
import com.feiyisys.mapper.AdminMapper;
import com.feiyisys.service.AdminService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.feiyisys.utils.JwtUtil;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;

/**
 * <p>
 * 系统管理员表 服务实现类
 * </p>
 *
 * @author wq
 * @since 2025-10-10
 */
@Service
public class AdminServiceImpl extends ServiceImpl<AdminMapper, Admin> implements AdminService {
    @Resource
    private JwtUtil jwtUtil;

    @Override
    public String login(UserLoginDTO userLoginDTO) {
        // 条件构造器，用来构建查询条件
        LambdaQueryWrapper<Admin> Wrapper = new LambdaQueryWrapper<>();
        // 设置查询条件，要求数据库里的username与前端传进来的username相等
        Wrapper.eq(Admin::getUsername, userLoginDTO.getUsername());
        // 调用getOne()方法，根据条件构造器查询数据库，返回User对象
        Admin admin = this.getOne(Wrapper);
        // 抛出异常可以立即停止当前的执行流程
        if (admin == null){
            throw new RuntimeException("用户名不存在或者密码不正确");
        }
        // 使用BCrypt算法的checkpw()方法对用户输入的密码和数据库里密码的哈希值进行匹配
        if(!BCrypt.checkpw(userLoginDTO.getPassword(), admin.getPassword())){
            throw new RuntimeException("用户名不存在或者密码不正确");
        }

        Claims claims = Jwts.claims();
        // 将user的id存放在claims中
        claims.put("id",admin.getId());
        String token=jwtUtil.createToken(claims);

        return token;
    }
}
